﻿using System;
using System.Data;
using Vallejos.Entidades.Enums;
using Vallejos.Entidades.ModeloDeDatos;

namespace Vallejos.Datos.Factory
{
    public class PersonaFactory
    {
        public Persona Crear(IDataReader dr)
        {
            var tipoInstancia = (InstanciaPersona) dr.GetInt32(2);
            Persona persona = null;
            
            switch (tipoInstancia)
            {
                case InstanciaPersona.Cliente:
                    persona = ConstruirCliente(dr);
                    break;
                case InstanciaPersona.EmpleadoDeConcesionaria:
                    persona = ConstruirEmpleadoDeConcesionaria(dr);
                    break;
                case InstanciaPersona.EmpleadoBancario:
                    persona = ConstruirEmpleadoBancario(dr);
                    break;
                
            }

            return persona;
        }

        private EmpleadoBancario ConstruirEmpleadoBancario(IDataReader dr)
        {
            return new EmpleadoBancario
                               {
                                   Id = dr.GetInt32(0),
                                   Usuario = new Usuario { Id = dr.GetInt32(1) },
                                   Ambito = new Ambito{ IdAmbito = (IdAmbito)dr.GetInt32(2)},
                                   DatosPersonales = new InformacionPersonal {Id = dr.GetInt32(3)},
                                   DatosDomiciliarios =
                                       dr.IsDBNull(4) ? null : new InformacionDomiciliaria {Id = dr.GetInt32(4)},
                                   Legajo = dr.IsDBNull(7) ? String.Empty : dr.GetString(7)
                               };

        }

        private EmpleadoDeConcesionaria ConstruirEmpleadoDeConcesionaria(IDataReader dr)
        {
            return new EmpleadoDeConcesionaria
                               {
                                   Id = dr.GetInt32(0),
                                   Usuario = new Usuario { Id = dr.GetInt32(1) },
                                   Ambito = new Ambito { IdAmbito = (IdAmbito)dr.GetInt32(2) },
                                   DatosPersonales = new InformacionPersonal {Id = dr.GetInt32(3)},
                                   DatosDomiciliarios =
                                       dr.IsDBNull(4) ? null : new InformacionDomiciliaria {Id = dr.GetInt32(4)},
                                   Concesionaria = dr.IsDBNull(6) ? null : new Concesionaria {Id = dr.GetInt32(6)}
                               };

        }

        private Cliente ConstruirCliente(IDataReader dr)
        {
            return new Cliente
                              {
                                  Id = dr.GetInt32(0),
                                  Usuario = new Usuario { Id = dr.GetInt32(1) },
                                  Ambito = new Ambito { IdAmbito = (IdAmbito)dr.GetInt32(2) },
                                  DatosPersonales = new InformacionPersonal {Id = dr.GetInt32(3)},
                                  DatosDomiciliarios =
                                      dr.IsDBNull(4) ? null : new InformacionDomiciliaria {Id = dr.GetInt32(4)},
                                  DatosDeEmpresa =
                                      dr.IsDBNull(5) ? null : new InformacionDeEmpresa {Id = dr.GetInt32(5)}
                              };
        }
    }
}